寄生式继承(推荐 Es6,过时禁止使用的)
寄生式继承是一种继承模式,它通过在一个已有对象上添加方法或属性,然后返回该对象来实现继承。
寄生式继承:
- 寄生式继承是在原型式继承的基础上,对新对象进行扩展,然后返回新对象,从而实现继承。
javascriptfunction createChild(parent) { var child = Object.create(parent); // 原型式继承 child.sayHello = function () { console.log("Hello, I am " + this.name); }; return child; } var parent = { name: "Parent", }; var child = createChild(parent); // 寄生式继承 child.name = "Child"; child.sayHello(); // 输出 "Hello, I am Child"
缺陷例子
难以识别对象类型:由于寄生式继承返回的对象并不是通过构造函数创建的,因此无法通过 instanceof 操作符来准确识别对象的类型。
缺乏封装性:与原型式继承类似,寄生式继承也无法直接访问父对象构造函数内部的私有属性和方法,导致缺乏封装性。
存在对象间的耦合:由于寄生式继承是在已有对象上添加方法或属性,因此会导致对象之间的耦合性增加,容易造成对象间的依赖关系复杂化。
原型链混乱:如果不正确地处理原型链,可能会导致原型链混乱,使得代码难以理解和维护。
性能问题:由于寄生式继承通常涉及创建新的对象和复制属性或方法,可能会导致性能问题,尤其是在创建大量对象时。
js
// 父对象
var parent = {
colors: ["red", "blue", "green"],
sayHello: function () {
console.log("Hello from Parent");
},
};
// 寄生式继承
function createChild(obj) {
// 通过 Object.create() 方法创建一个新对象,并以 obj 为原型
var child = Object.create(obj);
// 添加额外的方法或属性
child.sayHi = function () {
console.log("Hi from Child");
};
// 返回新对象
return child;
}
// 创建子对象
var child1 = createChild(parent);
var child2 = createChild(parent);
// 问题1:难以识别对象类型
console.log(child1 instanceof Object); // 输出: true,但无法准确识别为子类类型
// 问题2:缺乏封装性
console.log(child1.sayHello); // 输出: function () { console.log("Hello from Parent"); }
// 问题3:存在对象间的耦合
child1.colors.push("yellow");
console.log(child2.colors); // 输出: ["red", "blue", "green", "yellow"]